/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.catalina.startup;

import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleListener;
import org.apache.tomcat.util.digester.Rule;
import org.xml.sax.Attributes;

/**
 * <p>
 * Rule that creates a new <code>LifecycleListener</code> instance, and
 * associates it with the top object on the stack (which must implement
 * <code>LifecycleListener</code>).
 * </p>
 */

public class LifecycleListenerRule extends Rule {

	// ----------------------------------------------------------- Constructors

	/**
	 * Construct a new instance of this Rule.
	 * 
	 * @param listenerClass
	 *            Default name of the LifecycleListener implementation class to
	 *            be created
	 * @param attributeName
	 *            Name of the attribute that optionally includes an override
	 *            name of the LifecycleListener class
	 */
	public LifecycleListenerRule(String listenerClass, String attributeName) {

		this.listenerClass = listenerClass;
		this.attributeName = attributeName;

	}

	// ----------------------------------------------------- Instance Variables

	/**
	 * The attribute name of an attribute that can override the implementation
	 * class name.
	 */
	private String attributeName;

	/**
	 * The name of the <code>LifecycleListener</code> implementation class.
	 */
	private String listenerClass;

	// --------------------------------------------------------- Public Methods

	/**
	 * Handle the beginning of an XML element.
	 * 
	 * @param attributes
	 *            The attributes of this element
	 * 
	 * @exception Exception
	 *                if a processing error occurs
	 */
	public void begin(String namespace, String name, Attributes attributes)
			throws Exception {

		// Instantiate a new LifecyleListener implementation object
		String className = listenerClass;
		if (attributeName != null) {
			String value = attributes.getValue(attributeName);
			if (value != null)
				className = value;
		}
		Class clazz = Class.forName(className);
		LifecycleListener listener = (LifecycleListener) clazz.newInstance();

		// Add this LifecycleListener to our associated component
		Lifecycle lifecycle = (Lifecycle) digester.peek();
		lifecycle.addLifecycleListener(listener);

	}

}
